<?php

namespace Core;

/**
 * Class App
 *
 * 应用程序的主入口点（Front Controller）。
 * 负责初始化请求、路由和响应。
 *
 * @package Core
 */
class App
{
    private Request $request;
    private Router $router;

    /**
     * App 构造函数.
     * 初始化核心组件。
     */
    public function __construct()
    {
        // 设置错误报告（开发时）
        ini_set('display_errors', '1');
        error_reporting(E_ALL);

        // 初始化核心组件
        $this->request = new Request();
        $this->router = new Router($this->request);
    }

    /**
     * 向路由器注册一个中间件。
     *
     * @param string $middlewareClass 实现了 Middleware 接口的类名
     * @return $this
     */
    public function addMiddleware(string $middlewareClass): self
    {
        $this->router->addMiddleware($middlewareClass);
        return $this;
    }

    /**
     * 运行应用程序。
     * 执行路由分发并发送最终响应。
     *
     * @return void
     */
    public function run(): void
    {
        try {
            // 分发请求，获取响应对象
            $response = $this->router->dispatch();
        } catch (\Throwable $e) {
            // 捕获在路由/中间件注册阶段发生的严重错误
            Logger::error($e);
            
            // 创建一个紧急响应
            $response = new Response();
            $response->status(500)
                     ->text("A critical application error occurred.");
        }

        // 发送响应（由 Response 类负责）
        $response->send();
    }
}